自定义菜单


不同系统有不同的菜单方式 , 以下内容将展示不同系统中菜单的差异以及提供菜单正常使用的方法 .

创建及设置菜单

创建菜单条 , 利用nw.Menu对象传入参数type: 'menubar'完成 .

var your_menu = new nw.Menu({ type: 'menubar' });

创建子菜单 , 并在子菜单添加菜单项添加到子菜单中 , 同时给菜单项以及菜单命名 .

大多数系统中 , 文本菜单是没有意义的 .

var submenu = new nw.Menu();

// 向子菜单中添加菜单项 . 
submenu.append(new nw.MenuItem({ label: 'Item A' }));
submenu.append(new nw.MenuItem({ label: 'Item B' }));

// 子菜单添加到菜单条 . 
your_menu.append(new nw.MenuItem({
  label: 'First Menu',
  submenu: submenu
}));

将创建好的菜单条赋值给NW菜单对象 .

nw.Window.get().menu = your_menu;

参考 菜单窗口 .

系统中菜单差异

Windows & Linux

Windows和Linux系统中 , 菜单条的作用相同 . 每个窗口的标题栏下都有一个菜单条 .

!!! 注 全屏/窗口模式

全屏/窗口模式 , 菜单条将显示在窗口顶部 . 可以通过设置`win.menu`为`null`实现移除菜单条 . 参考[`win.menu`](../../References/Window.md#winmenu)

Mac OS X

!!! 注 窗口行为变化

窗口行为特性从0.13版本发生变化 . 参考[版本从0.12迁移到0.13](../Migration/From 0.12 to 0.13.md#menu)

Mac系统中 , 应用只有一个菜单 , 无论应用有多少窗口 . 应用中的快捷键依赖应用中的菜单 , 比如Quit, CloseCopy .

默认情况下 , NW.js应用有一个默认的菜单及菜单项 , 包括应用名, 编辑窗口 . 可以使用menu.createMacBuiltin方法获取默认菜单以及自定义菜单 .

var mb = new nw.Menu({type:"menubar"});
mb.createMacBuiltin("your-app-name");
// 通过mb对象完成菜单的添加 , 插入以及删除
nw.Window.get().menu = mb;

!!! 注 固定菜单标题

应用中 , 菜单第一项显示由*your-app-name*变为*nwjs* . 固定菜单标题需要修改`nwjs.app/Contents/Resources/*.lproj/InfoPlist.strings`目录下文件中的`CFBundleName`值 , 由`your-app-name`修改为`nwjs` .

最佳方法

综上所述 , Windows和Linux系统中 , 应用每个窗口都有一个菜单条 ; Mac系统中 , 应用只有一个菜单 . 所以通常在主窗口中设置菜单 , 同时避免在多个窗口中使用菜单 .

不同系统中的应用可以设计不同的菜单使用方式 , 可以通过process.platform获取应用所在系统信息判断当前使用系统 .